#----------------------------------[知乎：叶枝黎曼]----------------------------
'''
将 n 堆石子绕圆形操场排放，现要将石子有序地合并成一堆。

规定每次只能选相邻的两堆合并成新的一堆，并将新的一堆的石子数记做该次合并的得分。

请编写一个程序，读入堆数 n 及每堆的石子数，并进行如下计算：

选择一种合并石子的方案，使得做 n−1 次合并得分总和最大。
选择一种合并石子的方案，使得做 n−1 次合并得分总和最小。
输入格式
第一行包含整数 n，表示共有 n 堆石子。

第二行包含 n 个整数，分别表示每堆石子的数量。

输出格式
输出共两行：

第一行为合并得分总和最小值，

第二行为合并得分总和最大值。

数据范围
1≤n≤200
输入样例：
4
4 5 9 4
输出样例：
43
54
'''
from copy import deepcopy
n = int(input())
s= [int(i) for i in input().split()]
s += deepcopy(s)
s.insert(0,0)

pre = [0]*(2*n + 1)
for i in range(1,2*n+1):
    pre[i] = pre[i - 1] + s[i]

f = [[-float('inf')]*(2*n + 1) for i in range(2*n + 1)]
g = [[float('inf')]*(2*n + 1) for i in range(2*n + 1)]
for Len in range(1,n+1):
    for left in range(1,2*n - Len + 2):
        right = left + Len - 1
        if Len == 1:
            f[left][right] = 0
            g[left][right] = 0
            continue
        for k in range(left,right):
            
            f[left][right] = max(f[left][right],f[left][k] + f[k + 1][right] + pre[right] - pre[left - 1])
            g[left][right] = min(g[left][right],g[left][k] + g[k + 1][right] + pre[right] - pre[left - 1])
resMax = -float('inf')
resMin = float('inf')


for left in range(1,n+1):
    right = left + n - 1
    resMax = max(resMax,f[left][right])
    resMin = min(resMin,g[left][right])

print(resMin)
print(resMax)
